XIゴ ミッションパスワード解析 計算方法
概要
本記事ではミッションパスワードが持つ情報について説明する
「ミッションの条件・ルール」→「パスワード」の変換を行うときの順序で解説する
以下、ミッションの条件・ルールをまとめて単に「ミッション」と呼ぶ
逆にパスワードからミッションの内容を知りたい場合は逆の手順をたどることになる
/icons/-.icon
変換方法
0. 目次
以下の手順でミッションからパスワードが計算できることを説明する。
1. ミッションからパス番号への変換
2. パス番号からパス符号への変換
3. パス符号からパスワードへの変換
1. ミッションからパス番号への変換
ミッションを1つの数値(パス番号と読んでおく)に変換する方法を解説する
パス番号は変換サイトでパスワードの右下に表示される
パスワードに含まれる情報
下表にパスワードに影響を与える項目をまとめた
全項目について択番号(選択肢に振られた番号)を決定することでミッションが確定する
メイン項目表は最終的にパス番号を計算するために必要な項目の表
サブ項目表はメイン項目の「条件」部分の値(0~65535)を計算するための項目の表
サブ項目はモードが STANDARD か LIMITED かで大きく異なるため分離した
択数はその項目の選択肢が何通りあるかを表す
例えば択数が9の場合、択番号は0~8のいずれかから選ぶことになる
メイン項目表
table:items_main
項目番号 項目 択数
1 プレイヤー数 2
2 足の速さ 9
3 スタイル 5
4 乱数シード 45
5 モード 2
6 条件(モードにより異なる) 65,536
7 基本ルール 40
8 数量条件1 1または16
9 数量条件2 1または16
10 評価方法 16
11 大会ID 64
サブ項目表(STANDARD)
table:items_standard_condition
項目番号 項目 択数
1 開始レベル 256
2 終了レベル 256
サブ項目(LIMITED)
table:items_limited_condition
項目番号 項目 択数
1 ダイス発生間隔 8
2 最低ライン 4
3 減速ライン 4
4 ワイルドダイス率 4
5 自爆ダイス率 8
6 爆発時間 4
7 初期ダイス数 4
各項目の選択肢
各項目の択番号と選択肢の一覧はこちらを参照
パス番号の計算
表の各項目の択番号から数値への変換
上部に掲げた items から始まる表(メイン項目・サブ項目)について、各項目の択番号が決まっているとする
このとき以下で各文字を定義する
表の項目数を$ n
$ i番目の項目の択数を$ a_i
$ i番目の項目の択番号を$ x_i
$ b_i = a_1 \times \dots \times a_{i-1} (ただし$ b_1 = 1)
以上のとき、表の選択に対応する値$ sは次で計算できる
$ s = \sum_{i=1}^n b_i x_i
(上式は、直感的には各桁の「数字」の数が択数によりばらばらであるような進数変換を表していると思うことができる)
メイン項目とサブ項目の統合
0~65535のいずれかになる値を以下で計算し、これをメイン項目の「条件」の択番号(つまり$ x_6)と考える
モードが STANDARD の場合、サブ項目表(STANDARD)に対応する選択を上記の方法で数値に変換する
モードが LIMITED の場合、サブ項目表(LIMITED)に対応する選択を上記の方法で数値に変換する
これでメイン項目の択番号がすべて埋まるはずなので、メイン項目に対応する選択を上記の方法で数値に変換する
この結果をパス番号$ pとする
/icons/-.icon
2. パス番号からパス符号への変換
手順 1. で計算したパス番号をそのままパスワードにすると、適当な文字列が全て通ってしまうことになる
そのため、パスワードが正しいかどうかを検出するためのチェックディジット$ eを追加し、パス符号$ qに変換する
手順 2. においては基本的に整数は十六進表記とする
符号の計算方法
チェックディジットは 8 bit の整数$ e(計算方法は後述)
チェックディジット$ eを$ pの下位ビット側に付加した数がパス符号$ qとなる
(整数の計算として見れば$ q = 2^8 p + eと書ける)
(例) p = 0x6b25, e = 0xf9 ならば q = 0x6b25f9
チェックディジットの計算
チェックディジット$ eは、巡回冗長検査(CRC)という方式を利用して$ pの値から計算される
手順は複雑だが以下の通り
1. $ pを 8 bit ごとに7個に区切り、逆順に並べたものを$ p'とする(上で計算した$ pは常に 56 bit に収まる)
2. CRC-32(生成多項式 $ x^{32} + x^{26} + x^{23} + x^{22} + x^{16} + x^{12} + x^{11} + x^{10} + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1)により$ p'の検査符号$ c(32 bit)を計算する
3. $ cの下位 8 bit と 0xa6 の排他的論理和をとった値をチェックディジット$ eとする
この 0xa6 が単なる恣意的な暗号化なのか、 CRC の初期値などに由来する意味のある値なのかは不明
利用されている CRC-32 について
CRC 自体の解説は割愛するが、二進法での割り算(筆算)によく似た計算を行う
通常の割り算において引き算をするところで、代わりに排他的論理和を行うことで CRC の手続きになる
以下のコードで表されるような手続きが利用されている
引数が$ p'、戻り値が$ cに対応する
code:crc32.c
uint64_t doCRC32(uint64_t val) {
uint64_t gen = 0x04c11db7;
for (int i = 0; i < 64; ++i) {
if (val & (1ull << 63)) {
val <<= 1;
val ^= (gen << 32);
} else {
val <<= 1;
}
}
return val >> 32;
}
/icons/-.icon
3. パス符号からパスワードへの変換
手順 2. で計算したパス符号$ qをひらがな11文字のパスワード(ゲーム内で使用されている形式)に変換する
数値とひらがなの対応
パスワードに使えるひらがなは45文字
数値との対応は次の表で表される
table:kana
値 文字 値 文字 値 文字 値 文字 値 文字
0 あ 10 い 18 う 27 え 35 お
1 か 11 き 19 く 28 け 36 こ
2 さ 12 し 20 す 29 せ 37 そ
3 た 13 ち 21 つ 30 て 38 と
4 な 14 に 22 ぬ 31 ね 39 の
5 は 15 ひ 23 ふ 32 へ 40 ほ
6 ま 16 み 24 む 33 め 41 も
7 や 25 ゆ 42 よ
8 ら 17 り 26 る 34 れ 43 ろ
9 わ 44 ん
パスワードの計算
パスワードはパス符号$ qを45進法(先頭を1の位とする)で表記したもの
$ i文字目のひらがなに対応する値を$ y_iとし、次が成立するように各$ y_iを定めることで決定する
$ q = \sum_{i=1}^{11} 45^{(i-1)} y_i
具体的には進数変換の手法で計算できる(具体例の 3. 参照)
/icons/-.icon
変換の具体例
1. ミッションからパス番号への変換
以下で、具体的にミッションに対してパス番号$ pを計算する手順を説明する。
ミッションの具体例
次の表(メイン項目・サブ項目)の選択肢で定められるミッションを例に説明する
「択番号$ x_i」の列がパス番号に変換される情報の本体である(その他の列は説明の便宜上加えたもの)
メイン項目表の選択肢
table:ex_items_main
項目番号 i 項目 選択肢 択番号 x_i 択数 a_i 積 b_i
1 プレイヤー数 2P 1 2 1
2 足の速さ ★4 4 9 2
3 スタイル XI JUMBO 1 5 18
4 乱数シード ランダム 44 45 90
5 モード STANDARD 0 2 4,050
6 条件(モードにより異なる) - (後述) 65,536 8,100
7 基本ルール SCORE AND LEVEL 8 40 530,841,600
8 数量条件1(LEVEL) LEVEL 15 10 16 21,233,664,000
9 数量条件2(SCORE) SCORE 100000 6 16 339,738,624,000
10 評価方法 最短タイム 11 16 5,435,817,984,000
11 大会ID パス表示なし 63 64 86,973,087,744,000
サブ項目表(STANDARD)の選択肢
table:ex_items_standard_condition
項目番号 項目 選択肢 択番号 x_i 択数 a_i 積 b_i
1 開始レベル 10 9 256 1
2 終了レベル 14 13 256 256
備考
モード: STANDARD に対応して、 サブ項目表(STANDARD)が使用されることが決まる
基本ルール: SCORE AND LEVEL に対応して、以下の項目の内容が決定する
数量条件1: LEVEL(択数16)
数量条件2: SCORE(択数16)
基本ルール + 数量条件全体で詳細ルール「SCORE 100000 AND LEVEL 15 CLEAR」が決定する
サブ項目表の開始/終了レベルの設定から、内部レベルは 10 → 11 → 12 → 13 → 14 のループとなる
条件が「LEVEL 15 CLEAR」なので内部レベルは3周する
具体的な計算
サブ項目表から条件(択番号 x_6)への変換
サブ項目表の項目数は$ n = 2であり、選択肢は上表のように$ x_1 = 9, \; x_2 = 13である
上述の式に当てはめて、条件部分の値は次のように計算できる
$ \begin{aligned} \sum_{i=1}^n b_i x_i &= b_1 x_1 + b_2 x_2 \\ &= 1 \cdot 9 + 256 \cdot 13 \\ &= 3337 \end{aligned}
この値がメイン項目表の択番号$ x_6として扱われる
メイン項目表からパス番号への変換
サブ項目の計算と同様に択番号をあてはめ、以下の値を得る
$ \begin{aligned} \sum_{i=1}^n b_i x_i &= b_1 x_1 + \dots + b_{11} x_{11} \\ &= 1 \cdot 1 + 2 \cdot 4 + 18 \cdot 1 + 90 \cdot 44 + 4050 \cdot 0 + 8100 \cdot 3337 + \dots + 86973087744000 \cdot 63 \\ &= 5541353567846487 \end{aligned}
この値がパス番号$ pである
補足
基本ルールによっては数量条件1や数量条件2が存在しない場合がある
このときその項目の択番号は0、択数は1として扱う
択数が1と扱われることで、$ b_iの値も後半から上表と異なる値で計算する必要がある
これが理由で、実はパス番号の存在領域は連続していない箇所がある
2. パス番号からパス符号への変換
パス番号を$ p=5541353567846487とする
次のようにチェックディジットが計算される
1. パス番号を十六進表記すると p = 0x13afd4eafc8057 であるため、8 bit ごとに区切って逆順にすると p' = 0x5780fcead4af13 となる
2. p' に対して前述の CRC-32 の手続きを行うことで c = 0xd323d28b を得る
3. c の下位 8 bit 0x8b と 0xa6 の排他的論理和からチェックディジット e = 0x2d が得られる
パス番号 p にチェックディジット e を追加することでパス符号 q = 0x13afd4eafc80572d が求められる
3. パス符号からパスワードへの変換
パス符号を q = 0x13afd4eafc80572d ($ q = 1418586513368700717)とする
45進数に変換するため、45で割っていき余りを計算する
$ \begin{aligned} 1418586513368700717 \div 45 &= 31524144741526682 \cdots 27 \\ 31524144741526682 \div 45 &= 700536549811704 \cdots 2 \\ & \vdots \\ 1874 \div 45 &= 41 \cdots 29 \\ 41 \div 45 &= 0 \cdots 41 \end{aligned}
以上、余りを上から順に並べると$ 27, 2, 24, 29, 30, 43, 15, 32, 33, 29, 41となる
上の値を対応表でひらがなに変換することで、ミッションパスワード「えさむせてろひへめせも」が得られる